﻿using Newtonsoft.Json.Linq;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.Utilities;
using System;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace Coldairarrow.Util
{
    /// <summary>
    /// 异步转同步,防止ASP.NET中死锁
    /// https://cpratt.co/async-tips-tricks/
    /// </summary>
    public static class AESHelper
    {
        /// <summary>
        /// AES解密
        /// </summary>
        /// <param name="strinput"></param>
        /// <param name="strkey"></param>
        /// <returns></returns>
        public static string AESDecrypt(string strinput, string strkey)
        {
            try
            {
                string dummyData = strinput.Trim().Replace("%", "").Replace(",", "").Replace(" ", "+").Replace("_", "/").Replace("-", "+");
                if (dummyData.Length % 4 > 0)
                {
                    dummyData = dummyData.PadRight(dummyData.Length + 4 - dummyData.Length % 4, '=');
                }
                byte[] inputArray = Convert.FromBase64String(dummyData);
                byte[] key = Encoding.UTF8.GetBytes(strkey);

                IBufferedCipher cipher = CipherUtilities.GetCipher("AES/ECB/PKCS5Padding");

                cipher.Init(false, AesKey(strkey));
                // cipher.Init(false, new ParametersWithIV(new DesParameters(key), key)); 带IV向量的算法可以用到。
                byte[] rv = new byte[cipher.GetOutputSize(inputArray.Length)];
                int tam = cipher.ProcessBytes(inputArray, 0, inputArray.Length, rv, 0);
                cipher.DoFinal(rv, tam);
                return Encoding.UTF8.GetString(rv);

            }
            catch (Exception ex)
            {

                return "";

            }

        }

        /// <summary>
        /// AES/ECB/PLcs5加密
        /// </summary>
        /// <param name="strinput"></param>
        /// <param name="strkey"></param>
        /// <returns></returns>
        public static string AESEncrypt(string strinput, string strkey)
        {
            try
            {
                byte[] inputArray = Encoding.UTF8.GetBytes(strinput);
                byte[] key = Encoding.UTF8.GetBytes(strkey);

                IBufferedCipher cipher = CipherUtilities.GetCipher("AES/ECB/PKCS5Padding");
                //cipher.Init(true, new ParametersWithIV(new DesParameters(key), key));
                cipher.Init(true, AesKey(strkey));
                byte[] rv = new byte[cipher.GetOutputSize(inputArray.Length)];
                int tam = cipher.ProcessBytes(inputArray, 0, inputArray.Length, rv, 0);
                cipher.DoFinal(rv, tam);
                return Convert.ToBase64String(rv);

            }
            catch (Exception ex)
            {
                return "";
            }
        }


        public static KeyParameter AesKey(String key)
        {
            byte[] bs = Encoding.Default.GetBytes(key);
            if (bs.Length != 16)
            {
                bs = Arrays.CopyOf(bs, 16);// 处理数组长度为16(不足16位,不空;超过16位取前16位)
            }
            return new KeyParameter(bs);
        }
    }
}
